using System;

namespace SvgToFontConverter.Models
{
    /// <summary>
    /// 性能设置类，用于配置大文件处理的性能参数
    /// </summary>
    public class PerformanceSettings
    {
        /// <summary>
        /// 批处理大小（每批处理的文件数量）
        /// 默认值：500，适合大多数情况
        /// 建议范围：100-1000
        /// </summary>
        public int BatchSize { get; set; } = 500;
        
        /// <summary>
        /// 内存清理间隔（每处理多少个字符后进行垃圾回收）
        /// 默认值：1000
        /// </summary>
        public int MemoryCleanupInterval { get; set; } = 1000;
        
        /// <summary>
        /// 批次间延迟（毫秒）
        /// 默认值：100ms，避免系统过载
        /// </summary>
        public int BatchDelayMs { get; set; } = 100;
        
        /// <summary>
        /// 进度报告间隔（每处理多少个文件报告一次进度）
        /// 默认值：100
        /// </summary>
        public int ProgressReportInterval { get; set; } = 100;
        
        /// <summary>
        /// 是否启用详细日志输出
        /// </summary>
        public bool VerboseLogging { get; set; } = false;
        
        /// <summary>
        /// 进程超时时间（秒）
        /// 默认值：300秒（5分钟）
        /// </summary>
        public int ProcessTimeoutSeconds { get; set; } = 300;
        
        /// <summary>
        /// 根据文件数量自动调整批处理大小
        /// </summary>
        /// <param name="fileCount">文件总数</param>
        /// <returns>优化后的批处理大小</returns>
        public int GetOptimalBatchSize(int fileCount)
        {
            if (fileCount <= 100)
                return Math.Min(BatchSize, fileCount);
            else if (fileCount <= 1000)
                return Math.Min(BatchSize, 200);
            else if (fileCount <= 5000)
                return Math.Min(BatchSize, 500);
            else
                return Math.Min(BatchSize, 800); // 对于超大文件集，使用更大的批次
        }
        
        /// <summary>
        /// 获取默认设置
        /// </summary>
        /// <returns>默认性能设置</returns>
        public static PerformanceSettings GetDefault()
        {
            return new PerformanceSettings();
        }
        
        /// <summary>
        /// 获取高性能设置（适合强大的机器）
        /// </summary>
        /// <returns>高性能设置</returns>
        public static PerformanceSettings GetHighPerformance()
        {
            return new PerformanceSettings
            {
                BatchSize = 1000,
                MemoryCleanupInterval = 2000,
                BatchDelayMs = 50,
                ProgressReportInterval = 200,
                ProcessTimeoutSeconds = 600
            };
        }
        
        /// <summary>
        /// 获取保守设置（适合较弱的机器或内存有限的情况）
        /// </summary>
        /// <returns>保守性能设置</returns>
        public static PerformanceSettings GetConservative()
        {
            return new PerformanceSettings
            {
                BatchSize = 200,
                MemoryCleanupInterval = 500,
                BatchDelayMs = 200,
                ProgressReportInterval = 50,
                ProcessTimeoutSeconds = 180
            };
        }
    }
}